package com.dabai.qrtools.qrcode;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextUtils;
import android.widget.ImageView;

import com.dabai.qrtools.R;
import com.dabai.qrtools.dialog.MdcDialog;
import com.dabai.qrtools.other.MainUtils;
import com.dabai.qrtools.ui.QrCodeScannerActivity;
import com.dabai.qrtools.utils.ActivityUtils;
import com.dabai.qrtools.utils.DabaiUtils;
import com.dabai.qrtools.utils.FileUtils;
import com.dabai.qrtools.utils.NotificationUtils;
import com.dabai.qrtools.utils.SharedPreferencesUtils;
import com.dabai.qrtools.utils.StringUtils;
import com.dabai.qrtools.utils.ViewUtils;
import com.google.android.material.textfield.TextInputLayout;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.activity.CaptureActivity;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.datamatrix.encoder.SymbolShapeHint;
import com.google.zxing.qrcode.QRCodeWriter;
import com.permissionx.guolindev.PermissionX;

import java.util.Hashtable;
import java.util.Random;

/**
 * 二维码生成工具
 */
public class QRCodeUtils {


    public static void playSound(Context context){
        if (SharedPreferencesUtils.getDefaultSharedPreferences(context).getBoolean("scanSound",false)){
            MediaPlayer mPlayer = MediaPlayer.create(context, R.raw.beep);
            mPlayer.start();
        }
    }
    public static void playVibration(Context context){
        if (SharedPreferencesUtils.getDefaultSharedPreferences(context).getBoolean("scanVibration",true)){
            NotificationUtils.vibrator(context);
        }
    }


    public static void saveQrImageToDCIM(Context context, String text){

        if (text.isEmpty()) {
            DabaiUtils.showToast(context, "保存失败:内容为空");
            return;
        }

        Bitmap bit = QRCodeUtils.createSimpleQrCodeBitmap(context,text, Integer.parseInt(DabaiUtils.getSharedPreferencesString(context, "sideLength", "500")));

        if (bit == null) {
            DabaiUtils.showToast(context, "保存失败:内容过大");
            return;
        }

        boolean isOk = FileUtils.saveBitmapToDCIM(context, bit, "QRTools", "QRTools_" + new Random().nextInt(100000));
        DabaiUtils.showToast(context, isOk ? "保存成功" : "保存失败");

    }


    public static void setImageView(Context context, ImageView imageView,String content){

        Bitmap bit = createSimpleQrCodeBitmap(context,content);

        if (bit == null) {
            DabaiUtils.showToast(context, "生成失败:超出长度限制");
            return;
        }

        imageView.setImageBitmap(bit);
    }


    /**
     * 得到二维码扫描仪结果
     *
     * @param data 数据
     * @return {@link String}
     */
    public static String getQrCodeScannerResult(Intent data){
        return data.getStringExtra("qrContent");
    }

    /**
     * 启动二维码扫描仪
     *
     * @param activity 活动
     * @param reqCode  申请代码
     */
    public static void startQrCodeScanner(Activity activity, int reqCode){
        ActivityUtils.startActivityForResult(activity, QrCodeScannerActivity.class,reqCode);
    }


    /**
     * 生成简单二维码
     *
     * @param content                字符串内容
     * @param width                  二维码宽度
     * @param height                 二维码高度
     * @param character_set          编码方式（一般使用UTF-8）
     * @param error_correction_level 容错率 L：7% M：15% Q：25% H：35%
     * @param margin                 空白边距（二维码与边框的空白区域）
     * @param color_black            黑色色块
     * @param color_white            白色色块
     * @return BitMap
     */
    public static Bitmap createQRCodeBitmap(String content, int width, int height,
                                            String character_set, String error_correction_level, int version,
                                            String margin, int color_black, int color_white) {
        // 字符串内容判空
        if (TextUtils.isEmpty(content)) {
            return null;
        }
        // 宽和高>=0
        if (width < 0 || height < 0) {
            return null;
        }
        try {
            //1.设置二维码相关配置
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            // 字符转码格式设置
            if (!TextUtils.isEmpty(character_set)) {
                hints.put(EncodeHintType.CHARACTER_SET, character_set);
            }
            // 容错率设置
            if (!TextUtils.isEmpty(error_correction_level)) {
                hints.put(EncodeHintType.ERROR_CORRECTION, error_correction_level);
            }
            // 容错率设置
            if (version!=0) {
                hints.put(EncodeHintType.QR_VERSION, String.valueOf(version));
            }

            // 空白边距设置
            if (!TextUtils.isEmpty(margin)) {
                hints.put(EncodeHintType.MARGIN, margin);
            }
            //2.将配置参数传入到QRCodeWriter的encode方法生成BitMatrix(位矩阵)对象 */
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            // 3.创建像素数组,并根据BitMatrix(位矩阵)对象为数组元素赋颜色值 */
            int[] pixels = new int[width * height];

            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    //bitMatrix.get(x,y)方法返回true是黑色色块，false是白色色块
                    if (bitMatrix.get(x, y)) {
                        pixels[y * width + x] = color_black;
                        //黑色色块像素设置
                    } else {
                        pixels[y * width + x] = color_white;
                        // 白色色块像素设置
                    }
                }
            }
            // 4.创建Bitmap对象,根据像素数组设置Bitmap每个像素点的颜色值,并返回Bitmap对象 */
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        } catch (WriterException e) {
            return null;
        }
    }


    /**
     * 创建简单的二维码位图
     *
     * @param content 内容
     * @return {@link Bitmap}
     */
    public static Bitmap createSimpleQrCodeBitmap(Context context,String content){
        return createQRCodeBitmap(content, 700, 700, "UTF-8", MainUtils.getErrorCorrectionLevel(context)
        ,MainUtils.getQrVersion(context),"1",Color.BLACK,Color.WHITE);
    }

    /**
     * 创建简单的二维码位图
     *
     * @param content 内容
     * @param width   宽度
     * @return {@link Bitmap}
     */
    public static Bitmap createSimpleQrCodeBitmap(Context context,String content,int width){
        return createQRCodeBitmap(content, width, width, "UTF-8", MainUtils.getErrorCorrectionLevel(context),MainUtils.getQrVersion(context), "1", Color.BLACK, Color.WHITE);
    }
    /**
     * 创建简单的二维码位图
     *
     * @param content 内容
     * @param width   宽度
     * @return {@link Bitmap}
     */
    public static Bitmap createSimpleColorQrCodeBitmap(Context context,String content,int width,int foreground,int background){
        return createQRCodeBitmap(content, width, width, "UTF-8", MainUtils.getErrorCorrectionLevel(context),MainUtils.getQrVersion(context), "1",foreground, background);
    }



}
